<?php
/**
 * Smarty plugin
 * @package Smarty
 * @subpackage plugins
 */


/**
 * Smarty truncate modifier plugin
 *
 * Type:     modifier<br>
 * Name:     truncate<br>
 * Purpose:  Truncate a string to a certain length if necessary,
 *           optionally splitting in the middle of a word, and
 *           appending the $etc string or inserting $etc into the middle.
 * @link http://smarty.php.net/manual/en/language.modifier.truncate.php
 *          truncate (Smarty online manual)
 * @author   Monte Ohrt <monte at ohrt dot com>
 * @param string
 * @param integer
 * @param string
 * @param boolean
 * @param boolean
 * @return string
 */
 function   gbk_strlen($string)   
  {   
          if(extension_loaded('mbstring'))   
          {   
                  mb_internal_encoding('GBK');   
    
                  return   mb_strlen($string);   
          }   
          else   
          {   
                  preg_match_all('/[\x81-\xfe]?./',   $string,   $match);   
    
                  return   count($match[0]);   
          }   
  }   
    
  function   gbk_substr($string,   $start,   $length   =   null)   
  {   
          if(extension_loaded('mbstring'))   
          {   
                  mb_internal_encoding('GBK');   
    
                  if(is_null($length))   
                  {   
                          return   mb_substr($string,   $start);   
                  }   
                  else   
                  {   
                          return   mb_substr($string,   $start,   $length);   
                  }   
          }   
          else   
          {   
                  preg_match_all('/[\x81-\xfe]?./',   $string,   $match);   
    
                  if(is_null($length))   
                  {   
                          return   implode('',   array_slice($match[0],   $start));   
                  }   
                  else   
                  {   
                          return   implode('',   array_slice($match[0],   $start,   $length));   
                  }   
          }   
  }   

function smarty_modifier_truncate($string, $length = 80, $etc = '...',
                                  $break_words = false, $middle = false)
{   
          if   ($length   ==   0)   
                  return   '';   
    
          if   (gbk_strlen($string)   >   $length)   {   
                  $length   -=   gbk_strlen($etc);   
                  if   (!$break_words   &&   !$middle)   {   
                          $string   =   preg_replace('/\s+?(\S+)?$/',   '',   gbk_substr($string,   0,   $length+1));   
                  }   
                  if(!$middle)   {   
                          return   gbk_substr($string,   0,   $length).$etc;   
                  }   else   {   
                          return   gbk_substr($string,   0,   $length/2)   .   $etc   .   gbk_substr($string,   -$length/2);   
                  }   
          }   else   {   
                  return   $string;   
          }   
  }   


/* vim: set expandtab: */

?>
